স্মার্ট পয়েন্টার (C++11)

Computer Programming - সি++ প্রোগ্রামিং (C++ Programming) ডাইনামিক মেমোরি ম্যানেজমেন্ট |
217
217

স্মার্ট পয়েন্টার হলো C++ এর একটি বিশেষ পয়েন্টার ক্লাস, যা C++11 থেকে যোগ করা হয়েছে। স্মার্ট পয়েন্টার প্রোগ্রামারদের জন্য ম্যানুয়াল মেমোরি ব্যবস্থাপনা ছাড়াই মেমোরি ম্যানেজমেন্ট সহজতর করে। স্মার্ট পয়েন্টারগুলি নিজে থেকেই মেমোরি বরাদ্দ ও মুক্ত করতে পারে, যা মেমোরি লিক এবং ড্যাংলিং পয়েন্টার সমস্যা সমাধানে সহায়ক।

স্মার্ট পয়েন্টারের প্রয়োজনীয়তা

C++ এ সাধারণ পয়েন্টার ব্যবহার করলে ডাইনামিক মেমোরি বরাদ্দের পরে delete বা delete[] ব্যবহার করে ম্যানুয়ালি মেমোরি মুক্ত করতে হয়। যদি ভুলে মেমোরি মুক্ত করা না হয়, তবে মেমোরি লিক এর সমস্যা দেখা দিতে পারে। স্মার্ট পয়েন্টার এই ধরনের সমস্যার সমাধান করে। এটি নিজে থেকেই মেমোরি মুক্ত করতে সক্ষম, ফলে প্রোগ্রামারকে মেমোরি ব্যবস্থাপনার দিকে কম মনোযোগ দিতে হয় এবং প্রোগ্রাম আরও কার্যকর হয়।

C++ এর প্রধান স্মার্ট পয়েন্টার ধরনের

  1. unique_ptr: মেমোরি বরাদ্দে একক মালিকানা সংরক্ষণ করে। একই সময়ে কেবলমাত্র একটি unique_ptr পয়েন্টার মেমোরির মালিক হতে পারে।
  2. shared_ptr: মেমোরির মালিকানা একাধিক পয়েন্টারের মধ্যে ভাগ করে নেওয়া যায়। মেমোরি স্বয়ংক্রিয়ভাবে মুক্ত করা হয় যখন সব shared_ptr পয়েন্টার মেমোরি ছেড়ে দেয়।
  3. weak_ptr: এটি একটি shared_ptr এর জন্য একটি উইক রেফারেন্স ধরে রাখে। এটি মেমোরির মালিকানা ধরে রাখে না, তবে shared_ptr এর সাথে সংযুক্ত থাকে।

১. unique_ptr

unique_ptr C++ এর একটি স্মার্ট পয়েন্টার যা শুধুমাত্র একক মালিকানা সমর্থন করে। একবার একটি unique_ptr মেমোরির মালিকানা নিলে, সেই মেমোরিকে আর অন্য কোনো unique_ptr ধরে রাখতে পারে না। এটি কেবলমাত্র মুভ করা যায়, কপি করা যায় না।

উদাহরণ: unique_ptr ব্যবহার

#include <iostream>
#include <memory> // unique_ptr এর জন্য
using namespace std;

int main() {
    unique_ptr<int> ptr1 = make_unique<int>(10); // ডাইনামিক্যালি মেমোরি বরাদ্দ
    cout << "Value: " << *ptr1 << endl; // Output: Value: 10

    // ptr2 = ptr1; // এটি বৈধ নয়, কারণ unique_ptr কপি করা যায় না
    unique_ptr<int> ptr2 = move(ptr1); // ptr1 এর মালিকানা ptr2 তে সরানো হয়েছে

    if (ptr1 == nullptr) {
        cout << "ptr1 is now nullptr." << endl;
    }

    cout << "Value through ptr2: " << *ptr2 << endl; // Output: Value through ptr2: 10

    return 0;
}

বর্ণনা:

  • এখানে make_unique<int>(10) দিয়ে একটি unique_ptr তৈরি করা হয়েছে।
  • move(ptr1) এর মাধ্যমে ptr1 এর মালিকানা ptr2 তে সরানো হয়েছে এবং ptr1 এর মান nullptr হয়েছে।

২. shared_ptr

shared_ptr হল একটি স্মার্ট পয়েন্টার যা মেমোরির মালিকানা একাধিক পয়েন্টারের মধ্যে ভাগ করে। shared_ptr এর রেফারেন্স কাউন্ট থাকে, যা নির্দেশ করে কতগুলি shared_ptr সেই মেমোরি পয়েন্ট করছে। যখন রেফারেন্স কাউন্ট শূন্য হয়ে যায়, তখন মেমোরি স্বয়ংক্রিয়ভাবে মুক্ত হয়ে যায়।

উদাহরণ: shared_ptr ব্যবহার

#include <iostream>
#include <memory> // shared_ptr এর জন্য
using namespace std;

int main() {
    shared_ptr<int> ptr1 = make_shared<int>(20); // ডাইনামিক্যালি মেমোরি বরাদ্দ
    cout << "Value: " << *ptr1 << endl; // Output: Value: 20
    cout << "Reference count: " << ptr1.use_count() << endl; // রেফারেন্স কাউন্ট চেক

    {
        shared_ptr<int> ptr2 = ptr1; // ptr1 এর সাথে ptr2 এর মালিকানা ভাগ করা হচ্ছে
        cout << "Reference count after ptr2: " << ptr1.use_count() << endl; // রেফারেন্স কাউন্ট: 2
    }

    cout << "Reference count after ptr2 goes out of scope: " << ptr1.use_count() << endl; // রেফারেন্স কাউন্ট: 1

    return 0;
}

বর্ণনা:

  • make_shared<int>(20) ব্যবহার করে একটি shared_ptr তৈরি করা হয়েছে।
  • ptr2 যখন ptr1 এর সাথে মেমোরি ভাগ করছে, তখন রেফারেন্স কাউন্ট 2 হয়েছে।
  • ptr2 স্কোপের বাইরে চলে যাওয়ার পর রেফারেন্স কাউন্ট 1 এ ফিরে এসেছে।

৩. weak_ptr

weak_ptr একটি shared_ptr এর জন্য উইক রেফারেন্স প্রদান করে, যা মেমোরির মালিকানা ধরে রাখে না। এটি সাধারণত shared_ptr এর সাথে মেমোরি ব্যবহারের জন্য ব্যবহৃত হয়, যাতে shared_ptr এর রেফারেন্স কাউন্ট না বাড়ে এবং মেমোরি ব্যবস্থাপনা সহজ হয়।

উদাহরণ: weak_ptr ব্যবহার

#include <iostream>
#include <memory>
using namespace std;

int main() {
    shared_ptr<int> sharedPtr = make_shared<int>(30); // একটি shared_ptr তৈরি করা
    weak_ptr<int> weakPtr = sharedPtr; // একটি weak_ptr দিয়ে sharedPtr কে রেফারেন্স করা

    cout << "Shared pointer reference count: " << sharedPtr.use_count() << endl; // Output: 1

    if (auto lockedPtr = weakPtr.lock()) { // weak_ptr থেকে shared_ptr তৈরি করা
        cout << "Locked pointer value: " << *lockedPtr << endl; // Output: 30
    } else {
        cout << "weakPtr is expired." << endl;
    }

    return 0;
}

বর্ণনা:

  • এখানে weakPtr নামে একটি weak_ptr তৈরি করা হয়েছে, যা sharedPtr কে রেফারেন্স করছে।
  • weakPtr.lock() ব্যবহার করে একটি shared_ptr তৈরি করা হয়েছে, যা weakPtr সক্রিয় থাকলে তার মান প্রদর্শন করে।

unique_ptr, shared_ptr, এবং weak_ptr এর তুলনা

বৈশিষ্ট্যunique_ptrshared_ptrweak_ptr
মালিকানাএকক মালিকানাএকাধিক মালিকানামালিকানা ধরে রাখে না
রেফারেন্স কাউন্টনেইরেফারেন্স কাউন্ট থাকেনেই, তবে shared_ptr এর রেফারেন্স ধরে
কপি করাকপি করা যায় না, শুধু মুভ করা যায়কপি এবং মুভ করা যায়কপি করা যায়, কিন্তু সরাসরি মেমোরি অ্যাক্সেস নয়
ব্যবহারের উদ্দেশ্যএকক মালিকানা, স্বয়ংসম্পূর্ণ মালিকানার জন্যএকাধিক রেফারেন্স যখন প্রয়োজনউইক রেফারেন্স, সাইক্লিক ডিপেন্ডেন্স রোধে সহায়ক

স্মার্ট পয়েন্টারের সুবিধা

  1. মেমোরি লিক প্রতিরোধ: স্মার্ট পয়েন্টার নিজেই মেমোরি মুক্ত করতে সক্ষম, ফলে ম্যানুয়াল মেমোরি ম্যানেজমেন্টের প্রয়োজন হয় না।
  2. সহজ মেমোরি ম্যানেজমেন্ট: স্মার্ট পয়েন্টার প্রোগ্রামারকে মেমোরি ব্যবস্থাপনা নিয়ে কম চিন্তা করতে দেয়, কারণ এটি নিজেই মেমোরি বরাদ্দ এবং মুক্ত করতে পারে।
  3. ড্যাংলিং পয়েন্টার সমস্যা সমাধান: স্মার্ট পয়েন্টার মেমোরি ব্যবস্থাপনা সঠিকভাবে পরিচালনা করে, ফলে ড্যাংলিং পয়েন্টার সমস্যা কমে যায়।

সারসংক্ষেপ

  • unique_ptr: একক মালিকানা নিশ্চিত করে, অন্য কোনো পয়েন্টার সেই মেমোরির মালিক হতে পারে না।
  • shared_ptr: মেমোরি মালিকানা একাধিক পয়েন্টারের মধ্যে ভাগ করে নিতে সক্ষম।
  • weak_ptr: একটি shared_ptr এর উইক রেফারেন্স ধরে রাখে, যা মূলত রেফারেন্স কাউন্ট না বাড়িয়ে মেমোরি অ্যাক্সেস করতে দেয়।

স্মার্ট পয়েন্টার C++ এ মেমোরি ব্যবস্থাপনা সহজ, নিরাপদ, এবং কার্যকর করে তোলে, যা প্রোগ্রামিংয়ে মেমোরি লিক এবং ড্যাংলিং পয়েন্টার সমস্যার সমাধান প্রদান করে।

common.content_added_by
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion